<!-- 新朋友页面 -->
<template>
  <div class="new-friend-container">
    <van-nav-bar title="新的朋友"
                 :left-arrow="true"
                 @click-left="goBack">
      <template #right>
        <van-icon name="search"
                  size="20"
                  color="inherit"
                  @click="navigatorSearch" />
      </template>
    </van-nav-bar>

    <!--  -->
    <van-swipe-cell v-for="(newFriend, index) in newFriendList"
                    :key="index">
      <van-config-provider :theme-vars="themeVars">
        <van-cell-group>
          <van-cell center
                    clickable
                    @click="navigatorChat(newFriend.identity, newFriend.status)">
            <!-- 使用 title 插槽来自定义icon -->
            <template #icon>
              <van-badge :content="newFriend.noReadMessageCount"
                         max="99">
                <div>
                  <van-image width="50"
                             height="50"
                             :src="newFriend.avatar" />
                </div>
              </van-badge>
            </template>
            <!-- 使用 title 插槽来自定义标题 -->
            <template #title>
              <span class="title-lable-margin">{{newFriend.realName}}</span>
            </template>
            <!-- 使用 lable 插槽来自定义lable -->
            <template #label>
              <span class="title-lable-margin">{{$filters.ellipsis(newFriend.lasterLeavingMessage,10)}}</span>
            </template>
            <!-- 使用 lable 插槽来自定义lable -->
            <template #value>
              <span class="right-value">{{$filters.dataformat(Number(newFriend.lasterCreateTime), "YYYY-MM-DD HH:mm:ss")}}</span>
              <!-- 申请好友的状态，0-待处理（接收方）,1-等待验证（发送方），2-已添加（发送方），3-已同意（接收方），4-已拒绝（接收方），5-未通过（发送方） -->

              <div class="button-style"
                   v-if="newFriend.status ===0">
                <van-button type="success"
                            size="small"
                            class="agree-btn"
                            @click.stop="agree(newFriend.identity)">同意</van-button>
                <van-button type="danger"
                            size="small"
                            class="disagree-btn"
                            @click.stop="disagree">拒绝</van-button>
              </div>
              <div class="button-style"
                   v-if="newFriend.status ===1">
                <span>等待验证</span>
              </div>
              <div class="button-style"
                   v-if="newFriend.status ===2">
                <span>已添加</span>
              </div>
              <div class="button-style"
                   v-if="newFriend.status ===3">
                <span>已同意</span>
              </div>
              <div class="button-style"
                   v-if="newFriend.status ===4">
                <span>已拒绝</span>
              </div>
              <div class="button-style"
                   v-if="newFriend.status ===5">
                <span>未通过</span>
              </div>

            </template>
          </van-cell>
        </van-cell-group>
      </van-config-provider>

      <template #right>
        <van-button square
                    text="删除"
                    type="danger"
                    class="delete-button" />
      </template>
    </van-swipe-cell>
  </div>
</template>

<script>
import { Toast } from 'vant';
//这里可以导入其他文件（比如：组件，工具js，第三方插件js，json文件，图片文件等等）
//例如：import 《组件名称》 from '《组件路径》';
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  data () {
    var themeVars = {
      cellLabelMarginTop: "0.20667rem",
    };
    //这里存放数据
    return {
      // 主题样式
      themeVars,
      // 被动添加新朋友集合
      newFriendList: [],
    };
  },
  //方法集合
  methods: {
    // 初始化页面,获取当前用户尚未处理的新用户数据
    init () {
      var that = this;
      that.$http
        .get(that.$reqPrefix.im + "/im/pending-new-friend/list", {}).then(res => {
          if (res.data) {
            res.data.forEach(item => {
              that.newFriendList.push({
                //发送者唯一标识，目前是手机号
                "identity": item.fromIdentity,
                // 未读消息数量
                "noReadMessageCount": item.noReadMessageCount === 0 ? '' : item.noReadMessageCount,
                // 头像
                "avatar": item.fromAvatar,
                // 真实名字
                "realName": item.fromRealName,
                // 最近一条留言
                "lasterLeavingMessage": item.fromLasterLeavingMessage,
                // 最近一套留言的发送时间
                "lasterCreateTime": item.fromLasterCreateTime,
                // 添加好友的状态
                "status": item.status,
              });
            });
          }
          //构建总线监听
          that.$emitter.on('onmessage', that.onmessage);
        }).catch(err => {
          Toast.fail(err.data.message)
        });
    },
    // 调到搜索页面
    navigatorSearch () {
      this.$router.push("/search");
    },
    // 跳转到聊天框窗口
    navigatorChat (identity, status) {

      if (status === 2 || status === 3) {
        // 没有成为好友之前
        this.$router.push({ name: "OthersInfo", params: { 'identity': identity } });
      } else {
        // 已经成为好友就跳转这里
        this.$router.push({ name: "OthersTempChatInfo", params: { 'identity': identity } });
      }
    },
    // 返回上一层
    goBack () {
      this.$router.go(-1);
    },
    // 同意对方添加自己为好友
    agree (identity) {
      var that = this;
      // 调用接口，将当前用户与自己绑定起来
      this.$http
        .post(this.$reqPrefix.user + "/im/users/bind-contact", {
          'identity': identity
        }, null).then(res => {
          // 修改该列表中的状态
          that.newFriendList.forEach(item => {
            if (identity === item.identity) {
              item.status = 3;
            }
          });

          // 给对方发送通知，自己添加成功的请求
          const socket = this.$store.state.socket;
          if (socket) {
            // 封装添加好友的消息类型
            let addfriendResolveMessage = new proto.com.ouyu.im.Message();
            addfriendResolveMessage.setFrom(this.$socket.config.identity)
            addfriendResolveMessage.setTo(identity)
            addfriendResolveMessage.setContentType(SOCKET_CONSTANT.PACKET.MESSAGE_CONTENT_TYPE.TEXT_CONTENT);
            addfriendResolveMessage.setContent("好友添加成功");
            // 时间戳毫秒
            addfriendResolveMessage.setCreateTime(new Date().getTime());
            socket.send(addfriendResolveMessage, SOCKET_CONSTANT.PACKET.MESSAGE_TYPE.IM_FRIEND_ADD_RESOLVE);
          } else {
            Toast.fail("无效连接！")
          }
          Toast.success("添加成功");
        }).catch(err => {
          Toast.success("添加失败！");
        });
    },
    // 不同意对方添加自己为好友
    disagree () {
      // 如果使用这个api则需要导入Toast
      //Toast.success("成功文案");

      this.$toast("暂未开放！");
    },

    //总线回调函数
    onmessage: function (data) {

      // 如果接收到对方发送的同意添加好友，则进行本地更新状态
      if (data.messageType === SOCKET_CONSTANT.PACKET.MESSAGE_TYPE.IM_FRIEND_ADD_RESOLVE) {
        var identity = data.message.getFrom();
        // 判断数组中是否包含现有的数据，如果包含只是简单的更新，否则添加新数据
        this.newFriendList.forEach(item => {
          if (item.identity === identity) {
            item.status = 2;
          }
        });
      }
      // 如果接收到的消息是好友添加，则做相应处理，计数加1
      else if (data.messageType === SOCKET_CONSTANT.PACKET.MESSAGE_TYPE.IM_FRIEND_ADD_REQ) {
        var that = this;
        var identity = data.message.getFrom();
        // 转成string 字符串
        var lasterLeavingMessage = data.message.getContent();
        var lasterCreateTime = data.message.getCreateTime();
        // 判断数组中是否包含现有的数据，如果包含只是简单的更新，否则添加新数据
        var index = -1;
        for (var i = 0; i < that.newFriendList.length; i++) {
          if (identity === that.newFriendList[i].identity) {
            index = i;
            break;
          }
        }
        if (index > -1) {
          that.newFriendList.splice(index, 1, {
            //发送者唯一标识，目前是手机号
            "identity": that.newFriendList[index].identity,
            // 未读消息数量
            "noReadMessageCount": that.newFriendList[index].noReadMessageCount + 1,
            // 头像
            "avatar": that.newFriendList[index].avatar,
            // 真实名字
            "realName": that.newFriendList[index].realName,
            // 最近一条留言
            "lasterLeavingMessage": lasterLeavingMessage,
            // 最近一套留言的发送时间
            "lasterCreateTime": lasterCreateTime,
            // 添加好友的状态
            "status": that.newFriendList[index].status,
          });
        } else {
          // 根据唯一标识查询该用户信息，进行赋值
          that.$http
            .get(that.$reqPrefix.user + "/users/" + identity, {}).then(res => {
              // 否则就追加一条信息
              that.newFriendList.push({
                //发送者唯一标识，目前是手机号
                "identity": identity,
                // 未读消息数量
                "noReadMessageCount": '1',
                // 头像
                "avatar": res.data.avatar,
                // 真实名字
                "realName": res.data.realName,
                // 最近一条留言
                "lasterLeavingMessage": lasterLeavingMessage,
                // 最近一套留言的发送时间
                "lasterCreateTime": lasterCreateTime,
                // 添加好友的状态 待处理的状态
                "status": 1,
              });
            }).catch(err => {
              Toast.fail(err.data.message)
            });
        }
      }
    },
  },
  //监听属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //生命周期 - 创建完成（可以访问当前this实例）
  created () {
    this.init();
  },
  //生命周期 - 挂载完成（可以访问DOM元素）
  mounted () { },
  //生命周期 - 创建之前
  beforeCreate () { },
  //生命周期 - 挂载之前
  beforeMount () { },
  //生命周期 - 更新之前
  beforeUpdate () { },
  //生命周期 - 更新之后
  updated () { },
  //生命周期 - 销毁之前
  beforeUnmount () { },
  //生命周期 - 销毁完成
  unmounted () {
    //销毁监听
    this.$emitter.off('onmessage', this.onmessage);
  },
  //如果页面有keep-alive缓存功能，这个函数会触发
  activated () { },
};
</script>
<style lang="less" scoped>
//@import url(); 引入公共css类
.new-friend-container {
  position: relative;
  background: whitesmoke;
}

.delete-button {
  height: 100%;
}
.button-style {
}
.agree-btn {
  width: 55px;
  margin-right: 20px;
}
.disagree-btn {
  width: 55px;
}
.title-lable-margin {
  margin-left: 10px;
}
</style>
